#include "MyTimer.h"


//定时器(定时器模式)测试程序   V1.0           修改日期：2025/6/7
//实现功能：LED灯以1S为周期闪烁
//By:TAO XIN YU (陶鑫宇)


//初始化TIMER2
//参数： prescaler：			预分频器值
//参数： period：				重装载计数器值
//无返回值
void MyTimer2_init(unsigned int prescaler,unsigned int period)
{
	//使能定时器输出引脚时钟
	rcu_periph_clock_enable(RCU_GPIOA);
	//各通道GPIO设置
	//设置TIMER2_CHO引脚电气属性 复用悬空
	gpio_mode_set(GPIOA,GPIO_MODE_AF,GPIO_PUPD_NONE,TIMER2_CH0_PIN);
	//设置TIMER2_CHO引脚输出配置
	gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,TIMER2_CH0_PIN);
	//设置TIMER2_CHO引脚复用
	gpio_af_set(GPIOA,GPIO_AF_1,TIMER2_CH0_PIN);
	
	//声明TIMER2参数配置结构体
	timer_parameter_struct timer_initpara={0};
	//声明TIMER2输出比较控制结构体
	timer_oc_parameter_struct timer_ocinitpara={0};
	
	//开启定时器2时钟
	rcu_periph_clock_enable(RCU_TIMER2);
	
	//恢复缺省配置，以免出现不必要的错误
	timer_deinit(TIMER2);
	timer_struct_para_init(&timer_initpara);
	
	//配置预分频器
	timer_initpara.prescaler = prescaler-1;
	//配置对齐模式 边缘对齐
	timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
	//配置计数方向 向上计数
	timer_initpara.counterdirection = TIMER_COUNTER_UP;
	//配置重装载计数器最大值
	timer_initpara.period = period;
	//配置时钟分频
	timer_initpara.clockdivision  = TIMER_CKDIV_DIV1;
	//初始化时基单元
	timer_init(TIMER2,&timer_initpara);
	
	//配置输出比较单元
	//恢复缺省配置，以免出现不必要的错误
	timer_channel_output_struct_para_init(&timer_ocinitpara);
	
	//配置输出模式 捕获/比较使能
	timer_ocinitpara.outputstate=TIMER_CCX_ENABLE;
	//配置输出极性 高极性
	timer_ocinitpara.ocpolarity=TIMER_OC_POLARITY_HIGH;
	//配置输出空闲状态 低电平
	timer_ocinitpara.ocidlestate=TIMER_OC_IDLE_STATE_LOW;
	//定时器输出通道控制
	timer_channel_output_config(TIMER2,TIMER_CH_0,&timer_ocinitpara);
	
	//定时器通道输出比较值控制
	timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_0,period);
	//定时器通道输出模式控制 定时器模式
	timer_channel_output_mode_config(TIMER2,TIMER_CH_0,TIMER_OC_MODE_TIMING);
	//定时器通道影子寄存器使能/使能控制  失能
	timer_channel_output_shadow_config(TIMER2,TIMER_CH_0,TIMER_OC_SHADOW_DISABLE);
	
	//使能定时器 通道0中断 
	timer_interrupt_enable(TIMER2,TIMER_INT_CH0);
	//使能定时器
	timer_enable(TIMER2);
	
	//使能TIMER2中断 优先级1
	nvic_irq_enable(TIMER2_IRQn,1);
	
}

//TIMER2中断函数
void TIMER2_IRQHandler(void)
{
	//如果是 定时器2通道0 的中断
	if(RESET != timer_interrupt_flag_get(TIMER2,TIMER_INT_CH0) )
	{
		//翻转LED1
		LED1_TOGGLE();
		//清除 定时器2通道0 的中断标志位
		timer_interrupt_flag_clear(TIMER2,TIMER_INT_CH0);
	}
}


